package NowCoder.JavaSE.String;

/**
 * 链接：https://www.nowcoder.com/questionTerminal/30c1674ad5694b3f8f0bc2de6f005490
 * 来源：牛客网
 *
 * [编程题]二进制插入
 * 时间限制：C/C++ 3秒，其他语言6秒空间限制：C/C++ 32M，其他语言64M
 * 给定两个32位整数n和m，同时给定i和j，将m的二进制数位插入到n的二进制的第j到第i位,
 * 保证n的第j到第i位均为零，且m的二进制位数小于等于i-j+1，其中二进制的位数从0开始由低到高。
 *
 * 测试样例：
 * 1024，19，2，6
 * 返回：1100
 */
public class 二进制插入_编程_1_5_20 {
    /**
     *                  ！！！！不通过！！！！
    public int binInsert(int n, int m, int j, int i) throws NumberFormatException{
        // write code here
        String strn = Integer.toBinaryString(n);
        String strm = Integer.toBinaryString(m);

        if(strm.length() > i - j + 1){
            System.err.println("输入的数字不符合要求");
            return -1;
        }

        String ij = strn.substring(j,i);
        char[] arrOfIJ = ij.toCharArray();
        for(char z : arrOfIJ){
            if(z != '0'){
                System.err.println("输入的数字不符合要求");
                return -1;
            }
        }

        //走到这一步，代表了m 和 n至少满足，
        //m的二进制位数小于等于i - j + 1，且满足n的第 j 到 i位均为零
        //从倒数第i位加到倒数第j位
        int lengthOfn = strn.length();
        String str = strn.substring(0,lengthOfn - i - 1) + strm + strn.substring(lengthOfn - j);
        System.out.println(str);
//        System.out.println(strn);
//        System.out.println(strm);
        int num = bin2Dec(str);
        return num;
    }

    public static int bin2Dec(String binaryString) {
        int sum = 0;
        for (int i = 0; i < binaryString.length(); i++) {
            char ch = binaryString.charAt(i);
            if (ch > '2' || ch < '0')
                throw new NumberFormatException(String.valueOf(i));
            sum = sum * 2 + (binaryString.charAt(i) - '0');
        }
        return sum;
    }
     */

    public int binInsert(int n, int m, int j, int i) {
        while(j!=0)
        {
            m*=2;
            j--;
        }
        n+=m;
        return n;
    }
    public static void main(String[] args) {
        二进制插入_编程_1_5_20 n1 = new 二进制插入_编程_1_5_20();
        System.out.println(n1.binInsert(1024, 19, 2, 6));
    }
}
